// 📁 service/BookService.java
package com.library.management.service;

import com.library.management.entity.Book;
import com.library.management.entity.BookCategory;
import com.library.management.enums.BookStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Optional;

/**
 * 图书服务接口
 * 处理图书相关的业务逻辑
 */
public interface BookService extends BaseService<Book, Long> {

    /**
     * 根据ISBN查找图书
     */
    Optional<Book> findByIsbn(String isbn);

    /**
     * 检查ISBN是否存在
     */
    boolean existsByIsbn(String isbn);

    /**
     * 根据书名查找图书
     */
    List<Book> findByTitle(String title);

    /**
     * 根据作者查找图书
     */
    List<Book> findByAuthor(String author);

    /**
     * 根据出版社查找图书
     */
    List<Book> findByPublisher(String publisher);

    /**
     * 根据分类查找图书
     */
    List<Book> findByCategory(BookCategory category);

    /**
     * 根据分类ID查找图书
     */
    List<Book> findByCategoryId(Long categoryId);

    /**
     * 根据状态查找图书
     */
    List<Book> findByStatus(BookStatus status);

    /**
     * 查找可借阅的图书
     */
    List<Book> findAvailableBooks();

    /**
     * 根据书名模糊查询
     */
    List<Book> searchByTitle(String title);

    /**
     * 根据作者模糊查询
     */
    List<Book> searchByAuthor(String author);

    /**
     * 根据书名或作者模糊查询
     */
    List<Book> searchByTitleOrAuthor(String keyword);

    /**
     * 全文搜索
     */
    List<Book> fullTextSearch(String keyword);

    /**
     * 根据出版年份范围查询
     */
    List<Book> findByPublishYearRange(Integer startYear, Integer endYear);

    /**
     * 根据价格范围查询
     */
    List<Book> findByPriceRange(Double minPrice, Double maxPrice);

    /**
     * 分页查询指定状态的图书
     */
    Page<Book> findByStatus(BookStatus status, Pageable pageable);

    /**
     * 分页查询指定分类的图书
     */
    Page<Book> findByCategory(BookCategory category, Pageable pageable);

    /**
     * 查找热门借阅图书
     */
    List<Book> findPopularBooks(int limit);

    /**
     * 查找新入库的图书
     */
    List<Book> findNewBooks(int limit);

    /**
     * 借出图书
     */
    boolean borrowBook(Long bookId);

    /**
     * 归还图书
     */
    boolean returnBook(Long bookId);

    /**
     * 更新图书库存信息
     */
    void updateBookAvailableCopies(Long bookId);

    /**
     * 统计各状态图书数量
     */
    long countByStatus(BookStatus status);

    /**
     * 统计每个分类的图书数量
     */
    List<Object[]> countBooksByCategory();

    /**
     * 检查图书是否可以借阅
     */
    boolean isBookAvailableForBorrow(Long bookId);

    /**
     * 获取图书借阅次数
     */
    long getBorrowCount(Long bookId);

    /**
     * 获取图书当前借出数量
     */
    int getBorrowedCount(Long bookId);
}